package com.neusoft.ch3.hw;

public class HomeWorkCh3 {

	public static void main(String[] args) {
		test121();
	}
	/**
	 * 16、编写一个程序，找出大于200的最小的质数[选做题]
	 */
	private static void test12() {
		
	}
	
	/**
	 * 16.1、编写一个程序，找出1-100之间的所有的质数[选做题]
	 * 数学概念：质数也叫素数——只能被1和其自身整除的数。例如：2、3、5、7、11、13、17、19、23
	 *         9为什么不是质数？3可以整除9，否定9是质数；
	 * 判定依据：如果一个数N不能被2到N-1之间所有的数整除；则概述是质数；        
	 */
	private static void test121() {
		// 循环1--100之间的数，一一判定是否是质数
		System.out.println("1-100之间的质数有：");
		for (int i = 2; i <= 100; i++) {
			// 是否是质数标志变量：默认是质数
			boolean isPrime = true;
			/*
			 * 现在从2到N-1逐一进行验证是否可以被其中的某一个数整除，如果被一个数整除则否定该数不是质数； 如果，都不能整除，则可以肯定该数是质数
			 */
			// for (int j = 2; j <= i - 1; j++) {
			// 优化一：检验2到N/2+1即可
			// for (int j = 2; j <= i/2 + 1; j++) {
			// 优化二：检验2到N的平方根即可
			for (int j = 2; j <= (int) Math.sqrt(i); j++) {
				// 判定是否可以整除，如果可以整除则否定该数不是质数
				if (i % j == 0) {
					// 否定
					isPrime = false;
					// 找到一个数否定即可，不需要全部找出，终止内层for循环
					break;
				}
			}

			// 判定是否是质数的for循环结束以后，根据标志变量 isPrime是否为true判定该数是否是为质数
			if (isPrime == true) {
				// 是质数，输出
				System.out.print("  " + i);
			}
		}

		// 换行
		System.out.println();
	}
	
	/**
	 * 11、有一个不多于5位的正整数，求它是几位数，分别打印出每一位数字。
	 * （知识点：条件语句） [必做题]
	 */
	private static void test111() {
		// 初始值
		int num = 19099;
		// 万位
		int bitA = num / 10000;
		// 千位
		int bitB = num / 1000 % 10;
		// 百位
		int bitC = num / 100 % 10;
		// 十位
		int bitD = num / 10 % 10;
		// 个位
		int bitE = num % 10;
		// 万位输出
		if (bitA != 0) {
			System.out.print(" " + bitA+" "+bitB+" "+bitC+" "+bitD+" "+bitE);
		} else if (bitB != 0) {
			System.out.print(" "+bitB+" "+bitC+" "+bitD+" "+bitE);
		} else if (bitC != 0) {
			System.out.print(" "+bitC+" "+bitD+" "+bitE);
		} else if (bitD != 0) {
			System.out.print(" "+bitD+" "+bitE);
		} else if (bitE != 0) {
			System.out.print(" "+bitE);
		}
	}
	/**
	 * 11、有一个不多于19位的正整数，求它是几位数，分别打印出每一位数字。
	 * （知识点：条件语句） [必做题]
	 */
	private static void test11() {
		// 初始值
		long num = 1111111000011111L;
		
		// 假设最大的正整数的位数为19
		int maxBits = 18;
		// 标志位:当遇到最高位数时该标志位变为true
		boolean isBegin = false;
		// 获取的每个位数
		long bit;
		while (maxBits >= 1) {
			bit = num / (long) Math.pow(10, maxBits-1)%10;
			// 找到数字的最高时，修改标志变量
			if (bit != 0 && isBegin == false) {
				// 找到了最高位
				isBegin = true;
			}
			// 输出各个位数
			if (isBegin == true) {
				System.out.print(" " + bit);
			}
			// 改变循环因子
			maxBits--;
		}
		// 换行
		System.out.println();
	}
	/**
	 * 4、猴子第一天摘下若干个桃子，当即吃了一半，还不瘾，又多吃了一个，
	 * 第二天早上又将剩下的桃子吃掉一半，又多吃了一个。
	 * 以后每天早上都吃了前一天剩下的一半零一个。
	 * 到第10天早上想再吃时，见只剩下一个桃子了。
	 * 求第一天共摘了多少。（知识点：循环语句 while）[选做题]
	 * 提示：
	 *    倒推法比较简单。
	 */
	private static void test04() {
		// 变量:第10天剩余的桃子数
		int sum = 1;
		// 从第9天开始倒退计算到第1天
		int i = 9;
		while (i >= 1) {
			// 上一天的桃子数为（当日剩余桃子数+1）*2
			sum = (sum + 1) * 2;
			// 更改循环因子
			i--;
		}
		// 输出信息
		System.out.println("第一天的桃子数为：" + sum);
	}

}
